
using namespace std;

class Base {
    public:
        void pub_mem() {}               // public 成员
    protected:
        int prot_mem;                   // protected 成员
    private:
        char priv_mem;                  // private 成员
};

class Sneaky : public Base {
    friend void clobber(Sneaky&);       // 能访问 Sneaky::prot_mem
    // friend void clobber(Base&);      // 不能访问 Base::prot_mem
    int j;                              // j 默认是 private
};

// 正确：clobber 能访问 Sneaky 对象的 private 和 protected 成员
void clobber(Sneaky &s) { s.j = s.prot_mem = 0; }
// 错误：clobber 不能访问 Base 的 protected 成员
// void clobber(Base &b) { b.prot_mem = 0; }

struct Pub_Derv : public Base {
    // 正确：派生类能访问 protected 成员
    int f() { return prot_mem; }
    // 错误：private 成员对于派生类来说是不可访问的
    // char g() { return priv_mem; }
};

struct Priv_Derv : private Base {
    // private 不影响派生类的访问权限
    int f1() const { return prot_mem; }
};

struct Derived_from_Public : public Pub_Derv {
    // 正确：Base::prot_mem 在 Pub_Derv 中仍然是 protected 的
    int use_base() { return prot_mem; }
};

struct Derived_from_Private : public Priv_Derv {
    // 错误：Base::prot_mem 在 Priv_Derv 中是 private 的
    // int use_base() { return prot_mem; }
};

int main()
{
    // 派生访问说明符
    Pub_Derv d1;            // 继承自 Base 的成员是 public 的
    Priv_Derv d2;           // 继承自 Base 的成员是 private 的
    d1.pub_mem();           // 正确：pub_mem 在派生类中是 public 的
    // d2.pub_mem();        // 错误：pub_mem 在派生类中是 private 的
}